#include "stdafx.h"
#include "Triangle.h"

Triangle::Triangle(){}

Triangle::Triangle(Point p1, Point p2, Point p3)
{
	p[0] = p1;
	p[1] = p2;
	p[2] = p3;

	Vecteur v1(p1,p2);
	Vecteur v2(p1,p3);

	normale = v1.produitVectoriel(v2);

	normale.normalize();
}

Triangle::Triangle(Triangle const& triangle)
{
	for(int i = 0; i <3 ;i++)
		p[i] = triangle.p[i];

	normale = triangle.normale;
}

Triangle::~Triangle(){}

Triangle& Triangle::operator=(Triangle const& triangle)
{
	for(int i = 0; i <3 ;i++)
		p[i] = triangle.p[i];

	normale = triangle.normale;

	return *this;
}

bool Triangle::intersection(Rayon r)
{
	Vecteur dir = r.getDirection();
	Point orig = r.getOrigine();
	orig.normalize();

	// E1
	Vecteur E1(p[0],p[1]);
 
	// E2
	Vecteur E2(p[0],p[2]);
 
	// P
	Vecteur P = dir.produitVectoriel(E2);
 
	// determinant
	float det = E1.produitScalaire(P);
 
	// det > 0
	Vecteur T;
	if( det > 0 )
	{
		T = Vecteur(p[0],orig);
	}
	else
	{
		T = Vecteur(orig,p[0]);
		det = -det;
	}
 
	if( det < 0.0001f )
		return false;
 
	float u = T.produitScalaire(P);
	if( u < 0.0f || u > det )
		return false;
 
	// Q
	Vecteur Q = T.produitVectoriel(E1);
 
	//u + v <= 1
	float v = dir.produitScalaire(Q);
	if( v < 0.0f || u + v > det )
		return false;
 
	// Calculate t, scale parameters, ray intersects triangle
	float t = E2.produitScalaire(Q);
 
	float fInvDet = 1.0f / det;
	t *= fInvDet;
	u *= fInvDet;
	v *= fInvDet;

	Point p(orig, t, dir);

	inter.setPoint(p);
	inter.setT(t);

	if(r.getDirection().produitScalaire(normale)>0)
		normale.inverse();

	inter.setNormale(normale);
 
	return true;
}

BoiteEnglobante Triangle::getBoite(){
	BoiteEnglobante b;
	return b;
}

bool Triangle::aBoite()
{

	return false;
}